package com.fling.abcde;

import android.content.Context;

import com.baidu.location.BDAbstractLocationListener;
import com.baidu.location.BDLocation;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.lib.utils.SPUtils;
import com.lib.utils.XLog;

import java.lang.ref.WeakReference;

/**
 * @author FengLing
 * 描述：
 * Created on 2019-05-16 16:18:05
 */
public class LocationInfoManager {
    private LocationClient mLocationClient;
    private LocationListener mLocationListener;

    private static class Inner {
        private static LocationInfoManager locationInfoManager = new LocationInfoManager();
    }

    public static void start(Context context, LocationListener listener) {
        if (Inner.locationInfoManager.mLocationClient == null) {
            Inner.locationInfoManager.mLocationListener = listener != null ? listener : new LocationListener();
            //声明LocationClient类
            Inner.locationInfoManager.mLocationClient = new LocationClient(new WeakReference<>(context).get());
            //注册监听函数
            Inner.locationInfoManager.mLocationClient.registerLocationListener(Inner.locationInfoManager.mLocationListener);

            LocationClientOption option = new LocationClientOption();
            //可选，默认高精度，设置定位模式，高精度，低功耗，仅设备
            option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);
            //可选，默认gcj02，设置返回的定位结果坐标系
            option.setCoorType("bd09ll");
            //可选，默认0，即仅定位一次，设置发起定位请求的间隔需要大于等于1000ms才是有效的
            // option.setScanSpan(3000);
            //可选，设置是否需要地址信息，默认不需要
            option.setIsNeedAddress(true);
            //可选，默认false,设置是否使用gps
            option.setOpenGps(true);
            // //可选，默认false，设置是否当GPS有效时按照1S/1次频率输出GPS结果
            // option.setLocationNotify(true);
            // option.setIsNeedLocationDescribe(true);
            // //可选，默认false，设置是否需要位置语义化结果，可以在BDLocation.getLocationDescribe里得到，结果类似于“在北京天安门附近”
            // option.setIsNeedLocationPoiList(true);
            // //可选，默认false，设置是否需要POI结果，可以在BDLocation.getPoiList里得到
            // option.setIgnoreKillProcess(false);
            // //可选，默认true，定位SDK内部是一个SERVICE，并放到了独立进程，设置是否在stop的时候杀死这个进程，默认不杀死
            // option.SetIgnoreCacheException(false);
            // //可选，默认false，设置是否收集CRASH信息，默认收集
            // option.setEnableSimulateGps(false);
            // //可选，默认false，设置是否需要过滤GPS仿真结果，默认需要
            Inner.locationInfoManager.mLocationClient.setLocOption(option);
        } else {
            Inner.locationInfoManager.mLocationClient.start();
        }
    }

    public static void exit() {
        if (Inner.locationInfoManager.mLocationClient != null) {
            if (Inner.locationInfoManager.mLocationListener != null) {
                Inner.locationInfoManager.mLocationClient.unRegisterLocationListener(Inner.locationInfoManager.mLocationListener);
            }
            Inner.locationInfoManager.mLocationClient.stop();
        }
    }

    private static class LocationListener extends BDAbstractLocationListener {

        @Override
        public void onReceiveLocation(BDLocation bdLocation) {
            XLog.i("onReceiveLocation-->" + bdLocation.getAddrStr());
            SPUtils.getSP().edit()
                    .putString(SPUtils.KEY_LOCATED_CITY, bdLocation.getCity()/*.replace("市", "")*/)
                    .putString(SPUtils.KEY_LOCATED_DISTRICT, bdLocation.getDistrict())
                    .putString(SPUtils.KEY_LOCATED_INFO, bdLocation.getAddrStr())
                    .apply();
        }
    }
}